# -*- coding: latin-1 -*-

import socket
from itertools import izip, cycle

#=========================================================================================
MENS_CLAVE,MENS_USUARIO,MENS_OK,MENS_CHAT,MENS_NUEVA, \
MENS_RELOJ,MENS_JUGADA,MENS_TABLAS,MENS_RESPUESTA, \
MENS_RENDIRSE,MENS_PIERDETIEMPO,MENS_ATRAS,MENS_REINICIAR,MENS_NADA = list( "ABCDEFGHIJKLMN" )

#=========================================================================================

#=========================================================================================
class Almacen :
    pass
#=========================================================================================

#=========================================================================================
def xor_crypt_string(data, key):
    return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))
#=========================================================================================

#=========================================================================================
class Mensaje :
    def __init__( self ) :
        self.reset()

    def reset( self ) :
        self.liDatos = []
        self.siError = False

    def nuevo( self, tipo, txt ) :
        uno = Almacen()
        uno.tipo = tipo
        uno.texto = txt
        self.liDatos.append(  uno )

    def texto( self ) :
        resp = ""
        for uno in self.liDatos :
            tam = len(uno.texto)
            resp += str(tam) + "=" + uno.tipo + uno.texto
        return resp

    def lee( self, txt ) :
        self.liDatos = []
        def leeUno( desde ) :
            nIgual = txt.find( "=", desde )
            if nIgual == -1 :
                self.siError = True
                return -1
            tam = txt[desde:nIgual]
            if not tam.isdigit() :
                self.siError = True
                return -1
            tam = int( tam )
            uno = Almacen()
            uno.tipo = txt[nIgual+1]
            uno.texto = txt[nIgual+2:nIgual+2+tam]
            self.liDatos.append( uno )
            return nIgual+2+tam

        tamTXT = len(txt)
        n = 0
        while n < tamTXT :
            n = leeUno( n )
            if n == -1 :
                return

    def dameTipo( self, tipo ) :
        for uno in self.liDatos :
            if uno.tipo == tipo :
                return uno
        return None

    def siOK( self ) :
        ok = self.dameTipo( MENS_OK )
        if ok and ok.texto == "1" :
            return True
        return False

    def ponOK( self, siOK ) :
        self.nuevo( MENS_OK, "1" if siOK else "0" )

    def __iter__(self):
        self.pos = -1
        self.tam = len(self.liDatos)
        return self

    def next( self ) :
        self.pos += 1
        if self.pos >= self.tam :
            raise StopIteration()
        return self.liDatos[self.pos]

#=========================================================================================

#=========================================================================================
def miIP() :
    return socket.gethostbyname_ex(socket.gethostname())[2][0]
#=========================================================================================

